package cn.tedu.order.tcc;

import cn.tedu.order.entity.Order;
import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;

import java.math.BigDecimal;

/*
在接口中要定义 TCC 三个方法
 */
@LocalTCC
public interface OrderTccAction {
    /*
    BusinessActionContext上下文对象，用来从第一阶段向第二阶段传递数据，
    第一阶段需要业务数据参数用来冻结业务数据，

    为了避开 seata 的一个bug，最好不传递封装的对象，而是把数据打散一个个的单独传递

    第一阶段方法需要在业务代码中手动调用
     */
    @TwoPhaseBusinessAction(            //指定第一阶段方法
            name = "OrderTccAction",
            commitMethod = "commit",    //指定Confirm方法
            rollbackMethod = "rollback")//指定Cancel方法
    boolean prepare(BusinessActionContext ctx,
                    @BusinessActionContextParameter(paramName = "orderId") Long id,
                    Long userId,
                    Long productId,
                    Integer count,
                    BigDecimal money);      //T - Try

    /*
    第二阶段方法由 RM（资源管理器）接收 TC 的二阶段指令，执行二阶段方法
     */
    boolean commit(BusinessActionContext ctx);       //C - Confirm
    boolean rollback(BusinessActionContext ctx);     //C - Cancel
}
